<?php
/**
 * Created by PhpStorm.
 * User: y_yang
 * Date: 18-1-26
 * Time: 上午10:36
 */

namespace yang;


class Common
{
    public static $app_debug = true;

    public static function updateDebug($debug)
    {
        static::$app_debug = $debug;
    }

    public function path2url($path)
    {
        $root2 = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        $base2 = str_replace(DIRECTORY_SEPARATOR, '/', $_SERVER['DOCUMENT_ROOT']);
        return str_replace($base2, '', $root2);
    }

    /**
     * @param mixed
     */
    public function dump()
    {
        $str = func_get_args();
        foreach ($str as $arrrorstring) {
            // $arrrorstring = htmlspecialchars($arrrorstring);
            $pre = print_r($arrrorstring, true);
            echo '<p><pre style="font-size: 18px">' . $pre . '</pre></p>' . PHP_EOL;
        }
    }

    function fastcgi_finish_request()
    {
        ignore_user_abort(true);            // 客户端关闭程序继续执行
        header('X-Accel-Buffering: no');    // nginx 不缓存输出
        header("Connection: close");
        ob_end_flush();
        flush();
    }

    function http_response_code($code = NULL)
    {
        if (function_exists('http_response_code')) {
            return http_response_code($code);
        }
        if ($code !== NULL) {
            switch ($code) {
                case 100:
                    $text = 'Continue';
                    break;
                case 101:
                    $text = 'Switching Protocols';
                    break;
                case 200:
                    $text = 'OK';
                    break;
                case 201:
                    $text = 'Created';
                    break;
                case 202:
                    $text = 'Accepted';
                    break;
                case 203:
                    $text = 'Non-Authoritative Information';
                    break;
                case 204:
                    $text = 'No Content';
                    break;
                case 205:
                    $text = 'Reset Content';
                    break;
                case 206:
                    $text = 'Partial Content';
                    break;
                case 300:
                    $text = 'Multiple Choices';
                    break;
                case 301:
                    $text = 'Moved Permanently';
                    break;
                case 302:
                    $text = 'Moved Temporarily';
                    break;
                case 303:
                    $text = 'See Other';
                    break;
                case 304:
                    $text = 'Not Modified';
                    break;
                case 305:
                    $text = 'Use Proxy';
                    break;
                case 400:
                    $text = 'Bad Request';
                    break;
                case 401:
                    $text = 'Unauthorized';
                    break;
                case 402:
                    $text = 'Payment Required';
                    break;
                case 403:
                    $text = 'Forbidden';
                    break;
                case 404:
                    $text = 'Not Found';
                    break;
                case 405:
                    $text = 'Method Not Allowed';
                    break;
                case 406:
                    $text = 'Not Acceptable';
                    break;
                case 407:
                    $text = 'Proxy Authentication Required';
                    break;
                case 408:
                    $text = 'Request Time-out';
                    break;
                case 409:
                    $text = 'Conflict';
                    break;
                case 410:
                    $text = 'Gone';
                    break;
                case 411:
                    $text = 'Length Required';
                    break;
                case 412:
                    $text = 'Precondition Failed';
                    break;
                case 413:
                    $text = 'Request Entity Too Large';
                    break;
                case 414:
                    $text = 'Request-URI Too Large';
                    break;
                case 415:
                    $text = 'Unsupported Media Type';
                    break;
                case 500:
                    $text = 'Internal Server Error';
                    break;
                case 501:
                    $text = 'Not Implemented';
                    break;
                case 502:
                    $text = 'Bad Gateway';
                    break;
                case 503:
                    $text = 'Service Unavailable';
                    break;
                case 504:
                    $text = 'Gateway Time-out';
                    break;
                case 505:
                    $text = 'HTTP Version not supported';
                    break;
                default:
                    exit('Unknown http status code "' . htmlentities($code) . '"');
                    break;
            }
            $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
            header($protocol . ' ' . $code . ' ' . $text);
            $GLOBALS['http_response_code'] = $code;

        } else {
            $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);
        }
        return $code;
    }

    public function humpToDot($str)
    {
        $str = lcfirst($str);
        if (preg_match('/([A-Z]{1})/', $str)) {
            $str = preg_replace_callback('/([A-Z]{1})/', function ($matches) {
                return '.' . strtolower($matches[0]);
            }, $str);
        }
        return $str;
    }

    public function controller($callback)
    {
        if (is_string($callback)) {
            $callback = explode('/', $callback);
        }

        Request::create()->module($callback[0]);
        Request::create()->action(end($callback));
        Request::create()->controller($callback[1]);

        array_splice($callback, 0, 0, Env::get('app_name'));
        array_splice($callback, 2, 0, 'controller');

        $func = array_pop($callback);
        $class = implode('\\', $callback);
        return (new $class)->$func();
    }

    /**
     * @param $callback
     * @return \yang\Model
     */
    public function model($callback)
    {
        if (strpos($callback, '/')) {
            $callback = explode('/', trim($callback, '/'));
        } else {
            $callback = [$callback];
        }

        if (count($callback) < 3) {
            $base = [
                Request::create()->module(),
                Request::create()->action(),
                Request::create()->controller(),
            ];
            $callback = array_reverse($callback);
            for ($i = 2; $i >= 0; $i --) {
                $base[$i] = array_shift($callback);
                if (empty($callback)) break;
            }
            $callback = $base;
        }

        array_splice($callback, 0, 0, Env::get('app_name'));
        array_splice($callback, 2, 0, 'model');

        $class = implode('\\', $callback);
        return new $class;
    }

    /**
     * @param $callback
     * @return \yang\Model
     */
    public function table($callback)
    {
        return Db::table($callback);
    }
}